//
// Created by LiuYou on 2021/12/6.
//

#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>


int main(int argc, char** argv) {
    std::cout << "=====================[ 正确 ]======================" << std::endl;
    {
        std::vector<int> arr{5, 3, 1, 4, 2};
        std::copy( arr.begin(), arr.end(), std::ostream_iterator<int>( std::cout, "\t" ));
        std::cout << std::endl;

        std::partition( arr.begin(), arr.end(), [&](const auto& item) {
            return item < 3;
        } );

        std::copy( arr.begin(), arr.end(), std::ostream_iterator<int>( std::cout, "\t" ));
        std::cout << std::endl;
    }

    std::cout << "=====================[ 错误 ]======================" << std::endl;
    {
        std::vector<int> arr{5, 3, 1, 4, 2};
        std::copy( arr.begin(), arr.end(), std::ostream_iterator<int>( std::cout, "\t" ));
        std::cout << std::endl;

        std::stable_partition( arr.begin(), arr.end(), [&](const auto& item) {
            return item <= 3;
        } );

        std::copy( arr.begin(), arr.end(), std::ostream_iterator<int>( std::cout, "\t" ));
        std::cout << std::endl;
    }

    // 运行结果:
    /*
        /home/liuyou/CLionProjects/ZCYLS/cmake-build-debug/Partition2
        =====================[ 正确 ]======================
        5	3	1	4	2
        2	1	3	4	5
        =====================[ 错误 ]======================
        5	3	1	4	2
        1	2	5	3	4

        Process finished with exit code 0
     */

    /*
     * todo 笔记: 总结, 如果是分区的话, 使用 partition(); 而不要使用 stable_partition();
     *  因为使用 stable_partition();的结果可能是错误的, 这里是玄学了。WC！真的玄学！
     *  而且分区确实是会打乱顺序的, 使用 partition();就可以了。
     */
    return 0;
}
